package chemtools_logica.BDL.SFBean;

import chemtools_logica.Entidades.Eventoxproducto;

import chemtools_logica.Entidades.EventoxproductoPK;

import chemtools_logica.BDL.IL.BDL_SFEventoxproductoLocal;
import chemtools_logica.BDL.IR.BDL_SFEventoxproductoRemote;

import chemtools_logica.Beans.InsumoBean;

import chemtools_logica.Beans.ProductoBean;

import chemtools_logica.Entidades.Eventoxinsumo;

import chemtools_logica.Entidades.Insumo;

import chemtools_logica.Entidades.Producto;

import java.math.BigDecimal;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(name = "BDL_SFEventoxproducto", mappedName = "map-BDL_SFEventoxproducto")
public class BDL_SFEventoxproductoBean implements BDL_SFEventoxproductoRemote, BDL_SFEventoxproductoLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;

    public BDL_SFEventoxproductoBean() {
    }

    public Eventoxproducto persistEventoxproducto(Eventoxproducto eventoxproducto) {
        em.persist(eventoxproducto);
        return eventoxproducto;
    }

    public Eventoxproducto mergeEventoxproducto(Eventoxproducto eventoxproducto) {
        return em.merge(eventoxproducto);
    }

    public void removeEventoxproducto(Eventoxproducto eventoxproducto) {
        eventoxproducto =
            em.find(Eventoxproducto.class,
                    new EventoxproductoPK(eventoxproducto.getAlmacen().getIdAlmacen(),
                                          eventoxproducto.getEvento().getIdEvento(),
                                          eventoxproducto.getProducto().getIdProducto(),
                                          eventoxproducto.getUsuario().getIdUsuario()));
        em.remove(eventoxproducto);
    }

    /** <code>select o from Eventoxproducto o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Eventoxproducto> getEventoxproductoFindAll() {
        return em.createNamedQuery("Eventoxproducto.findAll", Eventoxproducto.class).getResultList();
    }
    
    public List<Eventoxproducto> getProductosGenerales(){
        List<Eventoxproducto> eventoxProducto = new ArrayList<Eventoxproducto>();
        
        String ejbQuery ="SELECT t1.* " + 
        "                            FROM chemtoolsbd.eventoxproducto t1 " + 
        "                            INNER JOIN chemtoolsbd.producto AS pro ON t1.idProducto = pro.idProducto " + 
        "                            INNER JOIN chemtoolsbd.almacen AS alm ON t1.idAlmacen = alm.idAlmacen " + 
        "                            INNER JOIN " + 
        "                            ( " + 
        "                              SELECT MAX(Fecha_Evento) maxdate, idProducto,idUsuario " + 
        "                              FROM chemtoolsbd.eventoxproducto " + 
        "                              GROUP BY idProducto " + 
        "                            ) t2 " + 
        "                              ON t1.idProducto = t2.idProducto " + 
        "                              AND t1.Fecha_Evento = t2.maxdate " +
                                      "AND t1.idEvento <> 9 ";
        try{
            Query query = em.createNativeQuery(ejbQuery, Eventoxproducto.class);
            eventoxProducto = query.getResultList();
        }catch(Exception e)
        {
            eventoxProducto = null;
        }
        
        return eventoxProducto;
    }
    
    public List<Eventoxproducto> getProductosporAlmacenActivo(int nidAlmacen){
        List<Eventoxproducto> eventoXProducto = new ArrayList<Eventoxproducto>();
        
        String ejbQuery ="SELECT t1.* " + 
        "                            FROM chemtoolsbd.eventoxproducto t1 " + 
        "                            INNER JOIN chemtoolsbd.producto AS pro ON t1.idProducto = pro.idProducto " + 
        "                            INNER JOIN chemtoolsbd.almacen AS alm ON t1.idAlmacen = alm.idAlmacen " + 
        "                            INNER JOIN " + 
        "                            ( " + 
        "                              SELECT MAX(Fecha_Evento) maxdate, idProducto,idUsuario " + 
        "                              FROM chemtoolsbd.eventoxproducto " + 
        "                              GROUP BY idProducto " + 
        "                            ) t2 " + 
        "                              ON t1.idProducto = t2.idProducto " + 
        "                              AND t1.Fecha_Evento = t2.maxdate " +
                                      "AND t1.idEvento <> 9 " + 
        "                            AND t1.idAlmacen = "+nidAlmacen;
        
        try{
            Query query = em.createNativeQuery(ejbQuery, Eventoxproducto.class);
            eventoXProducto = query.getResultList();
        }catch(Exception e)
        {
            eventoXProducto = null;
        }
        
        return eventoXProducto;
        
    }
    
    public List<Producto> busquedaProducto(ProductoBean bean){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        List<Producto> listaProductos = new ArrayList<Producto>();

        List<Eventoxproducto> evento = new ArrayList<Eventoxproducto>();
        
        String ejbQuery1 ="SELECT ins.* "+
                            "FROM eventoxproducto t1 " +
                            "INNER JOIN producto AS ins ON t1.idProducto = ins.idProducto " +
                            "INNER JOIN almacen AS alm ON t1.idAlmacen = alm.idAlmacen "+
                            "INNER JOIN tipoproducto AS tins ON ins.idTipoProducto = tins.idTipoProducto "+
                            "INNER JOIN empresa AS emp ON ins.idEmpresa = emp.idEmpresa "+
                            "INNER JOIN medida AS med ON tins.idMedida = med.idMedida "+
                            "INNER JOIN contenedores AS cont ON tins.idContenedores = cont.idContenedores "+
                            "INNER JOIN "+
                            "( "+
                              "SELECT MAX(Fecha_Evento) maxdate, idProducto,idUsuario "+
                              "FROM eventoxproducto "+
                              "GROUP BY idProducto "+
                            ") t2 "+
                              "ON t1.idProducto = t2.idProducto "+
                              "AND t1.Fecha_Evento = t2.maxdate " +
                              "AND t1.idEvento <> 9 ";
            
                            if(bean.getIdProducto() != null){
                                ejbQuery1 += "AND ins.idProducto like '%"+bean.getIdProducto()+"%' ";
                            }
                            if(bean.getComentario() != null){
                                ejbQuery1 += "AND ins.Comentario like '%"+bean.getComentario()+"%' ";
                            }
                            if(bean.getIdMedida() != -1){
                                ejbQuery1 += "AND med.idMedida = "+bean.getIdMedida()+" ";
                            }
                            if(bean.getIdtipoProducto() != -1){
                                ejbQuery1 += "AND tins.idTipoProducto = "+bean.getIdtipoProducto()+" ";
                            }
                            if(bean.getIdContenedores() != -1){
                                ejbQuery1 += "AND cont.idContenedores = "+bean.getIdContenedores()+" ";
                            }
                            if(bean.getIdAlmacen() != 0){
                                ejbQuery1 += "AND alm.idAlmacen = "+bean.getIdAlmacen()+" ";
                            }
                            if(bean.getIdEmpresa() != -1){
                                ejbQuery1 += "AND emp.idEmpresa = "+bean.getIdEmpresa()+" ";
                            }
                            if(bean.getCalidad() != -1){
                                ejbQuery1 += "AND ins.Calidad = "+bean.getCalidad()+" ";
                            }
                            if(bean.getEstado() != -1){
                                ejbQuery1 += "AND ins.Estado = "+bean.getEstado()+" ";
                            }
                            if(bean.getFechaCreaciondMin() != null || bean.getFechaCreaciondMax() != null){
                                if(bean.getFechaCreaciondMin() != null){
                                    ejbQuery1 += "AND ins.Fecha_Creacion >= '"+sdf.format(bean.getFechaCreaciondMin())+"' ";
                                }
                                if(bean.getFechaCreaciondMax() != null){
                                    ejbQuery1 += "AND ins.Fecha_Creacion <= '"+sdf.format(bean.getFechaCreaciondMax())+"' ";
                                } 
                            }
                            System.out.println(ejbQuery1);
        
        try{
            Query query = em.createNativeQuery(ejbQuery1, Producto.class);            
            listaProductos = query.getResultList();
        }catch(Exception e)
        {
            listaProductos = null;
        }
        return listaProductos;
    }
    
    public BigDecimal getContenidoProductoEvento(String idProducto){
        List<Eventoxproducto> eProducto = new ArrayList<Eventoxproducto>();
        String ejbQuery = "SELECT t1.* " +
                          "FROM eventoxproducto t1 " +
                          "WHERE t1.idProducto = '"+idProducto+"' " +
                          "LIMIT 1";
        BigDecimal contenido = null;
        try{
            Query query = em.createNativeQuery(ejbQuery, Eventoxproducto.class);
            eProducto = query.getResultList();
            contenido = eProducto.get(0).getContenido();
        }catch(Exception e){  
        }
        return contenido;
    }
}
